#include "config.h"

/**
@function
@name Cargar
@author Lucas
@param archConfig: char *
@param config: V_Array *
@return int
*/
int Cargar(V_Array* config, char* archConfig)
{
    FILE* aconfig=NULL;
    char* linea=NULL;
    tTag tagaux,stagaux,taginc;
    int res,i,err;

    char* tag = NULL;

    bool llaveAbierta = false;

    aconfig=fopen(archConfig,"rt");
    if(aconfig)
    {
        i=-1;
        res=getString(&linea, aconfig);
        while(res == RES_OK)
        {
            if(strlen(linea) > 0)
            {
                if(llaveAbierta)
                {
                    /* Si cierra llave */
                    if(strchr(linea, '}'))
                    {
                        llaveAbierta = false;
                    }
                    else
                    {
                        tag = cTrim(linea, " \t");
                        llenar(&stagaux,tag);

                        err=VA_get_i(*config,i,&taginc);
                        if (err==-1) return -1;
                        err=VA_add(&taginc.subTags,&stagaux);
                        if (err==-1) return -1;
                        err=VA_set(config,i,&taginc);
                        if (err==-1) return -1;

                        free(tag);
                    }
                }
                else
                {
                    llaveAbierta = true;
                    tag = cTrim(linea, " \t{");
                    llenar(&tagaux, tag);

                    err=VA_create(&tagaux.subTags, sizeof(tTag));
                    if (err==-1) return -1;
                    err=VA_add(config,&tagaux);
                    if (err==-1) return -1;
                    i++;
                    free(tag);

                }
                free(linea);
            }

            res=getString(&linea, aconfig);
        }
        fclose(aconfig);
        aconfig = NULL;
    }
    else
        return -1;
    return 0;


        /*i=-1;

        while(res!=ERROR_OR_EOF)
        {
            N=strlen(linea);
            lineaO=(char*)malloc(sizeof(char)*N+1);
            if (linea==NULL){
                return 1;
            }
            memcpy(lineaO,linea,N);
            lineaO[N] = '\0';

            aux=strtok(linea,"{");

            if (strcmp(lineaO,linea)==0)
               {
                    aux=strtok(linea,"}");

                    if (aux!=NULL)                  {
                           aux=strtok(linea," ");
                           aux=strtok(linea,"\t");
                           llenar(&stagaux,aux);
                           err=VA_get_i(*config,i,&taginc);
                           if (err==-1) return -1;
                           err=VA_add(&taginc.subTags,&stagaux);
                           if (err==-1) return -1;
                           err=VA_set(config,i,&taginc);
                           if (err==-1) return -1;

                      }
               }else {
                         llenar(&tagaux,aux);
                         err=VA_create(&tagaux.subTags,sizeof(tTag));
                         if (err==-1) return -1;
                         err=VA_add(config,&tagaux);
                         if (err==-1) return -1;
                         i++;
                     }

            free(lineaO);
            free(linea);
            res=getString(&linea, aconfig);*/
}

/* Funciones Auxiliares */

/**
@function
@name ExisteTagPrincipal
@author Lucas
@param config: V_Array *
@param tag: char *
@param pos: int *
@return int
*/
bool ExisteTagPrincipal(V_Array* config, char* tag,int* pos)
{
    int N,i;
    bool encontrado;
    tTag* vector;

    N=VA_count(*config);
    vector=VA_get(config);
    i=0;
    encontrado=false;

    while(i!=N && encontrado!=true)
    {
       if (strcmp(vector[i].nombre,tag)==0)
           encontrado=true;
       else i++;
    }
    free(vector);
    if (encontrado==true)
      {
      *pos=i;
      return 1;

      } else return 0;


}

/**
@function
@name ExisteSubTag
@author Lucas
@param config: V_Array *
@param tag: char *
@param subTag: char *
@param pos: int
@return int
*/
bool ExisteSubTag(V_Array* config, char* subTag, int pos)
{
    int j,M;
    bool encontrado;
    tTag *vector2;
    tTag elem;

    VA_get_i(*config,pos,&elem);
    M=VA_count(elem.subTags);
    vector2=VA_get(&elem.subTags);
    encontrado=false;
    j=0;

    while(j!=M && encontrado!=true)
    {
       if (strcmp(vector2[j].nombre,subTag)==0)
           encontrado=true;
       else j++;
    }
    /*free(vector);*/
    free(vector2);
    if (encontrado==true)
      return 1;
    else return 0;
}

/**
@function
@name Destruir
@author Lucas
@param config: V_Array *
@return int
*/
int Destruir(V_Array* config)
{

   tTag* vector,*vector2;
   int i,j,N,M;

   N=VA_count(*config);
   vector=VA_get(config);
   for (i=0;i<N;i++) {
       M=VA_count(vector[i].subTags);
       vector2=VA_get(&vector[i].subTags);
       for (j=0;j<M;j++)
          free(vector2[j].nombre);
       free(vector2);
       VA_destroy(&vector[i].subTags);
   }
   free(vector);
   VA_destroy(config);

   return 0;
}

/**
@function
@name llenar
@author Lucas
@param tag: tTag *
@param command: char *
@return int
*/
void llenar (tTag* tag, char* command)
{
    int n = 0;

    n = strlen(command) + 1;
    tag->nombre = (char*)malloc(sizeof(char) * n);
    memcpy(tag->nombre, command, n);
    tag->nombre[n-1] = '\0';
    /*strcpy(tag->nombre, command);*/
}
